home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpat2-1.000 / xpat2-1 / xpat2-1.04 / src / r_Bakers.c < prev    next >
C/C++ Source or Header  |  1994-04-22  |  3KB  |  104 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    X patience version 2 -- module r_Bakers.c                 */
  5. /*                                                */
  6. /*    Characteristics of the ``Baker's Dozen'' rules                 */
  7. /*    written by Michael Bischoff                         */
  8. /*    see COPYRIGHT.xpat2 for Copyright details                 */
  9. /*                                         */
  10. /*                                         */
  11. /*****************************************************************************/
  12. #include "xpatgame.h"
  13.  
  14. static void Bakers_new_game(void) {
  15.     int i, flag, onstack;
  16.     /* all cards visible */
  17.     for (i = 0; i < rules.numcards; ++i)
  18.     game.visible[i] = 1;
  19.     onstack = 13 - rules.numslots;
  20.     /* perhaps cards on the stacks */
  21.     for (i = 0; i <= FIRST_SLOT; ++i)
  22.     game.ind[i] = i * onstack;
  23.  
  24.     /* cards on the slots */
  25.     for (i = FIRST_SLOT; i <= LAST_SLOT; ++i)
  26.     game.ind[i+1] = game.ind[i] + rules.facedown + rules.faceup;
  27.     game.ind[IDECK+1] = rules.numcards;
  28.  
  29.     /* sort: 1) cards to the stacks */
  30.     for (i = 0; i < rules.numcards; ++i)
  31.     while (RANK(game.cards[i]) < onstack) {
  32.         /* card starts on its correct place */
  33.         Cardindex j;
  34.         Card c;
  35.         c = game.cards[i];
  36.         j = onstack * SUIT(c) + RANK(c);
  37.         if (j == i)    /* the correct place */
  38.         break;
  39.         game.cards[i] = game.cards[j];
  40.         game.cards[j] = c;
  41.     }
  42.  
  43.     /* sort: 2) kings to the bottom of the piles */
  44.     for (i = FIRST_SLOT; i <= LAST_SLOT; ++i) {
  45.     Cardindex j;
  46.     do {    /* ugly bubble-sort */
  47.         flag = 0;
  48.         for (j = game.ind[i]; j < INDEX_OF_LAST_CARD(i); ++j)
  49.         if (RANK(game.cards[j]) != King && RANK(game.cards[j+1]) == King) {
  50.             Card c;
  51.             flag = 1;
  52.             c = game.cards[j]; game.cards[j] = game.cards[j+1];
  53.             game.cards[j+1] = c;
  54.         }
  55.     } while (flag);
  56.     }
  57. }
  58.  
  59. static void Bakers_init(void) {
  60.     if (rules.numslots < 2)
  61.     rules.numslots = 2;
  62.     else if (rules.numslots > 13)
  63.     rules.numslots = 13;
  64. }
  65.  
  66. struct rules Bakers_rules = {
  67.     "Baker's Dozen",/* shortname */
  68.     NULL,    /* longname */
  69.     "bd",    /* abbrev */
  70.     7,        /* layout_hints */
  71.     NODEAL,    /* variant */
  72.     CUSTOM_SLOTS,/* customizable */
  73.     0,        /* customized */
  74.     52,        /* numcards */
  75.     4,        /* numstacks */
  76.     13,        /* numslots */
  77.     0,        /* numtmps */
  78.     1,        /* numdecks */
  79.     13,        /* cards_per_color */
  80.     0,        /* numjokers */
  81.     {0, 0, 0, 0},/* param[0], param[1], param[2], param[3] */
  82.     0,        /* facedown */
  83.     4,        /* faceup */
  84.     0,        /* newgame_bits */
  85.     Bakers_new_game,/* new_game */
  86.     NULL,    /* game_won */
  87.     NULL,    /* new_cards */
  88.     ES_NONE|US_R|MG_NONE|DC_ALWAYS|ST_ONE|STACK_SOURCE, /* move_bits */
  89.     NULL,    /* deal_cards */
  90.     NULL,    /* undeal_cards */
  91.     NULL,    /* stackable */
  92.     NULL,    /* movevalid */
  93.     NULL,    /* valid */
  94.     NULL,    /* relaxed_valid */
  95.     std_good_hint,/* good_hint */
  96.     NULL,    /* automove */
  97.     NULL,    /* score */
  98.     0,        /* maxscore */
  99.     {0, 0, 0, 0}, /* paramstring blocks */
  100.     0,        /* used */
  101.     Bakers_init,/* initfunc */
  102.     NULL,    /* local keyboard bindings */
  103. };
  104.